package org.ajc.auth.service.impl;

import org.ajc.auth.dto.LoginDTO;
import org.ajc.auth.service.ILoginService;
import org.ajc.auth.vo.LoginVO;
import org.ajc.base.data.ContextMap;
import org.ajc.org.domain.Employee;
import org.ajc.org.mapper.EmployeeMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Objects;
import java.util.UUID;

@Service
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
public class LoginServiceImpl implements ILoginService {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public LoginVO login(LoginDTO loginDTO) {
        // 校验 login是否为空
        if (Objects.isNull(loginDTO.getUsername()) || Objects.isNull(loginDTO.getPassword()))
        {
            throw new RuntimeException("账号密码为空~");
        }
        /*
            两个方案：
                方案一：账号密码一起查 对象是否为空 判断登录是否成功
                    好处：判断少一个
                    缺点：如果后台没搭好 有sql注入风险(账号也对，密码也对 or 1=1)
                         不好判断是账号错误还是密码错误
                方案二：先根据账号查对象 再根据对象密码是否匹配 最后再返回结果
                    好处：更准确地判是断账号错误还是密码错误
                    缺点：就是多一层判断
         */
        Employee employee = employeeMapper.queryByUsername(loginDTO);  // 直接使用Employee的mapper没有业务直接是有mapper
        //判断user是否为空
        if (Objects.isNull(employee))
        {
            throw new RuntimeException("账号或密码错误~");
        }
        // 判断密码错误  trim()方法 去除空格
        if (!employee.getPassword().equals(loginDTO.getPassword().trim()))
        {
            throw new RuntimeException("账号或密码错误11~");
        }
        // 数据脱敏 (数据敏感) 要哪些数据就返回哪些数据
        Employee user = new Employee();  // 必须要新new 一个对象来装
        BeanUtils.copyProperties(employee,user); //两个不同的对象但是属性都相同但是可以使用 可以使用copy方法拷贝
        user.setPassword("");
        // 创建返回前端的对象
        LoginVO loginVO = new LoginVO();
        loginVO.setUser(user);
        String token = UUID.randomUUID().toString();
        loginVO.setToken(token); // 随机生成token
        // token令牌 是一个登录凭证
        // 存全局map 如果直接使用 employee脱敏 那么存在map中的id就没有了
        ContextMap.loginMap.put(token,employee);  // 这里的employee 是未脱敏数据
        return loginVO;
    }
}
